﻿#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <Windows.h>
#include <stdbool.h>
#include <stdio.h>
#include <time.h>

#define POS_X 24
#define POS_y 5
#define BODY L'●'
#define WALL L'□'
#define FOOD L'★'
#define FOOD1 L'◆'
#define FOOD2 L'▲'

// 类型的声明

// 蛇的状态
// 正常， 撞墙， 撞到自己， 正常退出
enum GAME_STATUS
{
	OK,				//正常
	KILL_BY_WALL,	//撞墙
	KILL_BY_SELF,	//撞到自己
	END_NORMAL		//正常退出
};

// 蛇的方向
enum DIRECTION
{
	UP = 1, // 上
	DOWN,   // 下
	LEFT,   // 左
	RIGHT   // 右
};

// 创建贪吃蛇身的节点
typedef struct SnackNode
{
	// 坐标
	int x;
	int y;
	// 指向下一个节点的指针
	struct SnackNode* next;
}SnackNode, * pSnackNode;

// 面向对象:贪吃蛇
typedef struct Snake
{
	pSnackNode _pSnake;  // 指向蛇头的指针
	pSnackNode _pFood;   // 指向食物节点的指针
	enum DIRECTION _dir; // 蛇的方向
	enum GAME_STATUS _status; //蛇的状态
	int _food_weight; // 一个食物的分数
	int _score;		// 总分数
	int _sleep_time; // 休息时间，时间越短，速度越快，时间越长，速度越慢
	int _anger_num; // 蛇的怒气
}Snake, * pSnake;

// 函数的声明

// 初始化游戏
void GameStart(pSnake ps);

// 欢迎界面的打印
void WelcomeToGame();

//定位光标位置
void setpos(short x, short y);

// 3.绘制地图 
void CreateMap();

// 4.初始化蛇
void InitSnack(pSnake ps);

// 5.创建食物 
void CreateFood(pSnake ps);

// 运行游戏的逻辑
void GameRun(pSnake ps);

//贪吃蛇走一步->蛇的移动
void SnakeMove(pSnake ps);

// 判断下一个坐标是否是食物
int NextIsFood(pSnackNode pn, pSnake ps);

// 下一个是食物，吃掉
void EatFood(pSnackNode pn, pSnake ps);

// 下一个位置不是食物
void NoFood(pSnackNode pn, pSnake ps);

// 检测蛇是否撞墙
void KillByWall(pSnake ps);

// 检测蛇是否撞到自己
void KillBySelf(pSnake ps);

// 结束游戏 - 善后工作
void GameEnd(pSnake ps);